# -*- coding : utf_8 -*-
"""
=======================================
Time : 2025/3/22 22:25
Author : 田霄汉
Email : 522989570@qq.com
File : standardyaml_util.py
Project : pytest_demo
=======================================
"""
import re
import jsonpath
from utils.assert_util import AssertUtil
from utils.log_util import logs
from utils.requests_util import RequestsUtil
from utils.yaml_util import YamlUtil


class StandardyamlUtil:

    @staticmethod
    def standard_yaml(caseinfo):

        """
        校验测试用例yaml文件是否按照规范书写
        :param caseinfo: 测试用例yaml文件参数化caseinfo
        :return: 如果符合yaml规范则调用统一请求方法，不符合打印错误信息
        """

        # 获取yaml文件中的全部key值
        caseinfo_keys = caseinfo.keys()
        # 判断一级关键字是否包含：name，request，validate
        if "name" in caseinfo_keys and "request" in caseinfo_keys and "validate" in caseinfo_keys:
            # 判断request下面是否包含：method、url
            request_keys = caseinfo["request"].keys()
            if "method" in request_keys and "url" in request_keys:
                logs.info("架构检查通过")
                method = caseinfo['request'].pop("method")  # pop() 函数用于移除列表中的一个元素，并且返回该元素的值。
                url = caseinfo['request'].pop("url")
                # 将yaml文件中的request里面的键值对数据以字典的形式传递到请求参数里面
                res = RequestsUtil.send_request(method, url, **caseinfo['request'])  # caseinfo需要解包加**
                return_text = res.text
                return_code = res.status_code
                # return_json = ""
                try:
                    return_json = res.json()
                except Exception as e:
                    logs.error(f"接口请求返回的结果不是JSON格式，报错信息：{e}")

                # 提取值并写入extract.yaml文件
                if "extract" in caseinfo.keys():
                    for key, value in caseinfo["extract"].items():
                        if "(.*?)" in value or "(.+?)" in value:  # 正则表达式
                            zz_value = re.search(value, return_text)
                            if zz_value:
                                extract_value = {key: zz_value.group(1)}
                                YamlUtil().write_yaml("../extract.yml", extract_value)
                                # logs.info(f"{key}通过正则方式写入extract.yaml文件成功")
                        else:  # jsonpath
                            js_value = jsonpath.jsonpath(return_json, value)
                            if js_value:
                                extract_value = {key: js_value[0]}
                                # if type(extract_value) is not str:
                                #     extract_value = json.dumps(extract_value, ensure_ascii=False)
                                YamlUtil().write_yaml(yaml_name="../extract.yml", data=extract_value)
                                # logs.info(f"{key}通过jsonpath方式写入extract.yaml文件成功")
                    logs.info('写入extract文件成功')
                # 断言
                # self.assert_result(caseinfo['validate'], return_json, return_code)
                AssertUtil().assert_result(YamlValidate=caseinfo['validate'], sj_result=return_json,
                                           return_code=return_code)
            else:
                logs.error("在request下没有包含method,url")
        else:
            logs.error("一级关键字没有包含name,request,validate")
